package com.sxj.corejava.code07_面向对象.bms;

import java.util.Scanner;

/**
 * @author 石小俊
 * @date 2025年01月08日
 * 系统入口
 */
public class Start {

    private Scanner sc = new Scanner(System.in);

    public static void main(String[] args) {
//        Start start = new Start();
//        start.showMenu();
        new Start().showMenu();
    }

    public void showMenu() {
        Scanner sc = new Scanner(System.in);
        System.out.println("********************************欢迎来到紫金银行********************************");
        System.out.print("请选择服务(1.开户 2.登录 3.退出):");
        int choice = sc.nextInt();
        switch (choice) {
            case 1:
                register();
                break;
            case 2:
                login();
                break;
            case 3:
                System.out.println("提示:您已经退出,欢迎下次光临!");
                break;
            default:
                System.out.println("错误:您输入的选项有误,请重新输入");
                showMenu();
        }

    }

    /**
     * 开户方法,用户申请开户
     * 此处相当于用户填写开户申请单的过程
     * 最终需要调用银行提供的开户方法进行开户
     */
    public void register() {
        // 选择账户类型
        System.out.print("请选择开户的账户类型(1.储蓄账号 2.信用账户 3.贷款的储蓄账户 4.贷款的信用账号):");
        int choice = sc.nextInt();
        // 定义一个账户的父类,根据开户的账户类型不同,指向不同的子类
        Account account = null;
        switch (choice) {
            case 1:
                // 在父类无参构造方法中实现了卡号自增
                // 因此,在创建子类对象的时候,会自动调用父类构造方法实现卡号自增
                account = new SavingAccount();
                break;
            case 2:
                account = new CreditAccount();
                break;
            case 3:
                account = new LoanSavingAccount();
                break;
            case 4:
                account = new LoanCreditAccount();
                break;
            default:
                System.out.println("错误:您输入的选项有误,请重新开户!");
                register();
                break;
        }

        System.out.print("请输入户主姓名:");
        account.setName(sc.next());

        // 密码需要输入两次,且两次输入的密码必须一致
        // 共有三次机会
        int count = 0;
        while (true) {
            System.out.print("请输入账户密码:");
            String password = sc.next();
            System.out.print("请再次输入账户密码:");
            String password2 = sc.next();
            count++;
            if (password.equals(password2)) {
                // 如果两次输入密码一致,则密码设置成功
                account.setPassword(password);
                // 退出循环
                break;
            } else {
                System.out.println("错误:两次输入的密码不一致,请重新输入!");
            }
            if (count == 3) {
                System.out.println("错误:错误次数已达上限,请重新开户!");
                register();
                break;
            }
        }

        System.out.print("请输入账户身份证号码:");
        account.setPersonId(sc.next());
        System.out.print("请输入账户手机号码:");
        account.setPhone(sc.next());

        // 如果是储蓄账号,则开户完成
        // 如果是信用账户,则需要申请信用额度
        // CreditAccount account1 = new CreditAccount();
        // LoanCreditAccount account2 = new LoanCreditAccount();
        // 可以通过多态创建上面的账户
        // CreditAccount account2 = new LoanCreditAccount();
        // 根据上面两种账户可以看出,只要账户类型能够转换成CreditAccount,即表示属于信用账户类型
        if (account instanceof CreditAccount) {
            // 申请信用额度
            System.out.print("请输入信用额度:");
            CreditAccount creditAccount = (CreditAccount) account;
            creditAccount.setLimit(sc.nextDouble());
        }
//        if(account instanceof LoanCreditAccount){
//
//        }

        // 将开户的数据信息提交给银行,由银行进行开户
        // 即:调用银行的开户方法,将账户对象传递给对应的开户方法进行开户
//        boolean flag = Bank.register(account);
        if (Bank.register(account)) {
            System.out.println("提示:恭喜您,开户成功,您的卡号为:" + account.getId());
        } else {
            System.out.println("错误:对不起,开户失败!");
        }
        showMenu();
    }

    /**
     * 用户登录,用户输入卡号与密码进行登录
     * 登录的判定仍然是由银行实现的
     */
    public void login() {
        System.out.print("请输入卡号:");
        int id = sc.nextInt();
        System.out.print("请输入密码:");
        String password = sc.next();

        // 调用银行提供的登录功能判断当前卡号和密码是否正确
        Account account = Bank.login(id, password);
        if (account != null) {
            // 如果返回值不为null,则说明登录成功
            // 当成功登录之后,银行返回账户信息,进入银行的主菜单
            // 且进入主菜单时需要指定当前是哪一个账户的主菜单
            new BankMenu(account).showMenu();
        } else {
            System.out.println("错误:您输入的卡号或密码错误！");
            showMenu();
        }

    }
}
